package com.SouthernWall_404.Age_Capitalism.common.API;

import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.ItemStack;

public class InventoryMethod {


    /**
     * 检查玩家背包是否可以容纳指定物品堆栈
     * @param player 玩家
     * @param stack 要检查的物品堆栈
     * @return 如果背包可以容纳该物品堆栈则返回true，否则返回false
     */
    public static boolean canAddItemToInventory(Player player, ItemStack stack) {
        ItemStack testStack = stack.copy();

        // 只检查主背包的36个槽位（0-35）
        for (int i = 0; i < 36 && !testStack.isEmpty(); i++) {
            ItemStack slotStack = player.getInventory().getItem(i);

            if (slotStack.isEmpty()) {
                // 找到空槽位，可以放置全部物品
                return true;
            } else if (ItemStack.isSameItemSameTags(slotStack, testStack)) {
                // 相同物品，检查是否可以堆叠
                int spaceAvailable = slotStack.getMaxStackSize() - slotStack.getCount();
                if (spaceAvailable > 0) {
                    testStack.shrink(Math.min(testStack.getCount(), spaceAvailable));
                }
            }
        }

        return testStack.isEmpty(); // 如果testStack为空，说明所有物品都可以放置
    }

    /**
     * 尝试将物品堆栈添加到玩家背包，如果无法完全添加则丢弃剩余部分
     * @param player 玩家
     * @param stack 要添加的物品堆栈
     * @return 成功添加到背包的物品数量
     */
    public static int addItemToInventoryOrDrop(Player player, ItemStack stack) {
        ItemStack remaining = stack.copy();
        int initialCount = remaining.getCount();

        // 尝试添加到背包
        player.getInventory().add(remaining);

        // 如果有剩余物品，则丢出
        if (!remaining.isEmpty()) {
            player.drop(remaining, true, false);
        }

        // 刷新背包显示
        player.inventoryMenu.broadcastChanges();

        // 返回成功添加到背包的物品数量
        return initialCount - remaining.getCount();
    }

    /**
     * 尝试将物品堆栈添加到玩家背包，如果背包没有空间则全部丢出
     * @param player 玩家
     * @param stack 要添加的物品堆栈
     */
    public static void addItemToInventoryOrDropAll(Player player, ItemStack stack) {
        // 检查背包是否有空间
        if (canAddItemToInventory(player, stack)) {
            // 背包有空间，尝试添加
            player.getInventory().add(stack);

            // 理论上不应该有剩余，但如果有则丢出
            if (!stack.isEmpty()) {
                player.drop(stack, true, false);
            }
        } else {
            // 背包没有空间，直接丢出全部
            player.drop(stack.copy(), true, false);
        }

        // 刷新背包显示
        player.inventoryMenu.broadcastChanges();
    }
}
